#include <iostream> 	// included for ostream and istream
using namespace std;

/**
 * Represents a circle. This is the Circles interface (what is available
 * to others to utilize.
 * @course		CSCI 123 Section 00000
 * @assignment 
 * @date		mm/dd/yyyy
 * @author		Brad Rippe (00000000) brippe@fullcoll.edu
 * @version		1.0
 */
class Circle {
public:
	/**
	 * Adds the radius of two circles and creates a new circle with the
	 * result of the addition.
	 * @param aCircle1 the left hand side circle
	 * @param aCircle2 the right hand side circle
	 * @return a new Circle with circle1's radius added to circle2's
	 */
	friend Circle operator +(const Circle& aCircle, const Circle& aCircle2);

	/**
	 * Subtracts the radius of two circles and creates a new circle with the
	 * result of the subtraction.
	 * @param aCircle1 the left hand side circle
	 * @param aCircle2 the right hand side circle
	 * @return a new Circle with circle2's radius subtracted from circle1's
	 */
	friend Circle operator -(const Circle& aCircle, const Circle& aCircle2);

	/**
	 * Adds the radius of two circles and creates a new circle with the
	 * result of the addition.
	 * @param aCircle1 the left hand side circle
	 * @param aCircle2 the right hand side circle
	 * @return a new Circle with radius of circle1's radius added to circle2's
	 */
	friend bool operator ==(const Circle& aCircle, const Circle& aCircle2);

	/**
	 * Increments the circles radius by one
	 * This is the prefix operator
	 * @param aCircle the circle to increment
	 * @return the circle after the radius is incremented
	 *			hence the prefix operator
	 */
	friend Circle operator ++(Circle& aCircle);

	/**
	 * Increments the circles radius by one
	 * This is the postfix operator
	 * @param aCircle the circle to increment
	 * @return the circle before the radius is incremented
	 *			hence the postfix operator
	 */
	friend Circle operator ++(Circle& aCircle, int increment);

	/**
	 * Outputs a Circle
	 * @param aCircle the circle to output
	 * @return the output stream
	 */
	friend ostream& operator <<(ostream& aOutput, const Circle& aCircle);

	/**
	 * Input a Circle
	 * @param aCircle the circle to output
	 * @return the input stream
	 */
	friend istream& operator >>(istream& aInput, Circle& aCircle);

	/**
	 * Default constructor sets the circle's radius to 1
	 * @return a new Circle with the radius 1
	 */
	Circle();

	/**
	 * Constructor sets the circles radius.
	 * @param aRadius set the new circle's radius to aRadius
	 *			if aRadius is <= 0, returns a circle with a 
	 *			radius of 1
	 * @return a new circle with a radius of aRadius
	 */
	Circle(double aRadius);

	/**
	 * Returns the radius of the circle
	 * @return the radius of the circle
	 */
	double getRadius() const;

	/**
	 * Sets the radius of the circle
	 * @param aRadius the new radius of the circle
	 *			if aRadius is <= 0, the circle's radius
	 *			is set to 1
	 */
	void setRadius(double aRadius);

private:
	double mRadius;
};

